package com.yuan.algorithms.arithmetic_1;

import java.util.Scanner;

public class 递归_整数的划分问题 {

	static int sum = 0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			int[] a = new int[1000];
			f(n, a, 0);
			System.out.println(sum);
			sum = 0;
		}
	}

	/**
	 * 
	 * @param n 目标整数
	 * @param a 缓冲数据
	 * @param k 当前位置
	 */
	private static void f(int n, int[] a, int k) {
		if (n<=0) {
			for (int i = 0; i < k; i++) {
				System.out.print(a[i]+" ");
			}
			System.out.println();
			sum++;
			return;
		}
		for (int i = n; i > 0; i--) {
			if (k > 0 && i > a[k-1]) {//当前位置的数必须小于或等于前一个数
				continue;//去除重复的组合
			}
			a[k] = i; 
			f(n-i, a, k+1);
		}
	}

}
